#ifndef DYN_SPECIALFUNCTIONS_HANKEL_H
#define DYN_SPECIALFUNCTIONS_HANKEL_H

#include <complex>
#include <boost/math/special_functions/bessel.hpp>

#include "../utilities/dyn_functor.h"
#include "dyn_fortranLinkage_bessel.h"

using namespace std;
typedef complex<double> d_complex;

/*! \author Joey Dumont <joey.dumont@gmail.com>
 *
 * \date 2012-08-23
 *
 * \brief Implements the Hankel functiosn of both kind
 * for real and complex arguments.
 *
 * This is essentially a wrapper class that provides
 * functions to compute the Hankel functions of both kinds.
 *
 * For complex arguments,
 * we link to the Fortran code written by Amos \cite AMO86.
 * It computes the Bessel functions for complex arguments and nonnegative
 * order.
 *
 * \copyright LGPL.
 */

class Hankel : public Functor
{
public:
    /*! Constructor defines order. */
    Hankel(int _kind, double _order);

    /*! @name Accessor Functions */
    //@{
    int getKind(){return kind;}
    double getOrder(){return order;}

    void setKind(int _kind){kind=_kind;}
    void setOrder(double _order){order=_order;}
    //@}

    /*! @name Computation of Hankel function. */
    //@{
    double operator() (const double x){return x;}
    d_complex operator()(const d_complex z);
    //@}

protected:
    /*! Order and kind of function. */
    //@{
    int kind;
    double order;
    //@}


};

#endif // DYN_SPECIALFUNCTIONS_HANKEL_H
